package com.example.zz.example.pattern;

import android.app.Activity;
import android.os.Bundle;

import com.example.zz.example.ActivityUtils;
import com.example.zz.example.R;
import com.example.zz.example.pattern.builder.BuilderActivity;
import com.example.zz.example.pattern.eventbus.EventBusActivity;
import com.example.zz.example.pattern.eventcenter.EventCenterActivity;
import com.example.zz.example.pattern.composite.CompositeActivity;
import com.example.zz.example.pattern.facade.FacadeActivity;
import com.example.zz.example.pattern.factory.FactoryActivity;
import com.example.zz.example.pattern.hook.HookActivity;
import com.example.zz.example.pattern.iterator.IteratorActivity;
import com.example.zz.example.pattern.observer.ObserverActivity;

import com.example.zz.example.pattern.proxy.ProxyActivity;
import com.example.zz.example.pattern.responsibilitychain.ResponsibilityChainActivity;
import com.example.zz.example.pattern.singleton.SingletonActivity;

/**
 * GOF提出的面向对象设计模式23种类型：单原抽建工，组装外桥享适代，访中备模板，观状解职迭策略命。后面的数字是重要程度
 * 创建型：单例5、原型3、抽象工厂4、建造者5、工厂4
 * 就是用来创建对象的模式，将创建对象的过程进行了封装。
 * 结构型：组合4、装饰器3、外观5、桥接3、享元1、适配器4、代理4
 * 描述如何将类或者对象结合在一起形成更大的结构，使其功能更为强大。
 * 行为型：访问者1、中介者2、备忘录2、模板3、观察者5、状态3、解释器1、职责链3、迭代5、策略4、命令4
 * 是对在不同的对象之间划分责任和算法的抽象化。通过行为型模式，可以更加清晰地划分类与对象的职责，并研究系统在运行时实例对象之间的交互。
 * <p>
 * 面向过程设计模式：生产-消费者模式，生产者 -> 缓冲区 -> 消费者
 *
 * 设计模式的核心总结：将简单的事情复杂化！从而实现更多的细节、更多的控制、更多的扩展、更多的复用等。虽然这些控制也可以直接写，但是抽离出来后使代码结构更好
 * 单例：本来Person p = new Person(); 一行就可以新建一个对象；单例模式现在将其复杂化，变成一个类来完成一个对象的创建工作，在这个单例类中，有去重以减少资源功能、全局访问一个实例功能、保证了对象线程安全。
 * 代理：ProxyActivity案例中，本来new Image("test_10mb.jpg").display(); 一行就可以显示一个图片；代理模式现在将其复杂化，在直接操作Image类之前添加一个代理类，
 * 在代理类中完成对象的创建工作、实现了路径判空、日志打印、空对象判断等，还可以添加各类的功能，如缓存、延迟加载、事务处理、权限控制等。
 */

public class PatternActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pattern);

        findViewById(R.id.proxy_hook_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, HookActivity.class);
        });

        findViewById(R.id.event_center_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, EventCenterActivity.class);
        });

        findViewById(R.id.event_bus_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, EventBusActivity.class);
        });


        //===创建型设计模式=========================================================================================================
        findViewById(R.id.singleton_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, SingletonActivity.class);
        });

        findViewById(R.id.builder_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, BuilderActivity.class);
        });

        findViewById(R.id.factory_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, FactoryActivity.class);
        });


        //===结构型设计模式=========================================================================================================

        findViewById(R.id.composite_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, CompositeActivity.class);
        });

        findViewById(R.id.facade_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, FacadeActivity.class);
        });

        findViewById(R.id.proxy_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, ProxyActivity.class);
        });


        //===行为型设计模式=========================================================================================================
        findViewById(R.id.observer_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, ObserverActivity.class);
        });

        findViewById(R.id.responsibility_chain_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, ResponsibilityChainActivity.class);
        });

        findViewById(R.id.iterator_pattern).setOnClickListener(v -> {
            ActivityUtils.getInstance().goToActivity(PatternActivity.this, IteratorActivity.class);
        });


    }
}
